<?php
/*
 * Quark PHP Framework
 * Copyright 2011, Sahib Alejandro Jaramillo Leo.
 * http://quarkphp.com/
 * Licensed under the GNU General Public License (http://www.gnu.org/licenses/gpl.html).
 */
/**
 * Clase para manejar las URL
 * @filesource
 */
/**
 * Clase para manejar las URL
 * @author sahib
 */
class Url {

	/**
	 * Partes de la URI
	 * @access protected
	 * @var array
	 */
	protected static $uri_parts;

	/**
	 * URL del sitio web
	 * @access protected
	 * @var string
	 */
	protected static $web_url;

	/**
	 * Modifica la URI dependiendo de las rutas definidas en config.php
	 * @see $config['routes']
	 * @param string $uri uri
	 * @return string uri modificada
	 */
	static function enroute( $uri ) {

		foreach( Config::get( 'routes' ) as $pattern => $new_route ) {
			$pattern = "|^/$pattern/?\$|";
			if( preg_match( $pattern, $uri ) ) {
				$uri = preg_replace( $pattern, $new_route, $uri );
				break;
			}
		}
		return $uri;
	}

	/**
	 * Devuelve una URL valida para cambiar a lenguaje $lang
	 * @access public
	 * @param string $lang prefijo del nuevo lenguaje
	 * @return string url
	 */
	public static function getUrlSwitchLang( $lang ) {

		$web_url = Url::getBaseUrl( );
		/*
		 * Sustituir el prefijo lang en el subdominio en caso necesario, desarmando
		 * la URL sustituyendo valor y rearmando la URL.
		 * preg_replace() podría fallar.
		 */
		if( Lang::onMultiLangMode( ) ) {
			if( Lang::onSubdomain( ) ) {
				$url_parts = explode( '://', $web_url );
				$host_parts = explode( '.', $url_parts[1] );
				array_shift( $host_parts );
				array_unshift( $host_parts, $lang );
				$url_parts[1] = implode( '.', $host_parts );
				$web_url = implode( '://', $url_parts );
			}
			else {
				$web_url .= (Lang::onMultiLangMode( ) && !Lang::onSubdomain( ) ? $lang . '/' : NULL);
			}
		}
		
		// Agregar action si es diferente del default.
		$action = Controller::getRequestedActionName( TRUE ) == Config::get( 'default_action' ) ? NULL : Controller::getRequestedActionName( TRUE );
		// Agregar controller si es diferente del default o si el action esta definido.
		$controller = (Controller::getRequestedControllerName( TRUE ) != Config::get( 'default_controller' ) or $action != NULL) ? Controller::getRequestedControllerName(TRUE ) : NULL;
		
		// Formar URL y devolverla.
		return $web_url . // Controller
($controller != NULL ? strtolower( $controller ) . '/' : NULL) . // Action
		($action != NULL ? $action . '/' : NULL) . // parametros en la URI 
			 implode( '/', array_slice( self::getUriParts( ), 2 ) );
		}

		/**
		 * Devuelve la URL valida del sitio web
		 * @param string $uri
		 */
		static function getUrl( $uri = '' ) {

			$url_part = Config::get( 'url_prefix' ) . kill_slashes( $uri );
			return Url::getBaseUrl( ) . (Lang::onMultiLangMode( ) && !Lang::onSubdomain( ) ? Lang::getLang( ) . '/' : NULL) .
				 kill_slashes( $url_part ) . '/';
			}

			static function getBaseUrl( ) {

				if( self::$web_url == NULL ) {
					// URL del sitio, con tail slash
					$dir = kill_slashes( dirname( $_SERVER['SCRIPT_NAME'] ) );
					self::$web_url = // Protocolo
(substr( $_SERVER['SERVER_PROTOCOL'], 0, 5 ) == 'HTTPS' ? 'https' : 'http') . '://' .
						 // Host
						kill_slashes( $_SERVER['HTTP_HOST'] ) . '/' . // Web app path
(empty( $dir ) ? NULL : $dir . '/');
					}
					return self::$web_url;
				}

				/**
				 * Devuelve las partes de la URI
				 * @access public
				 * @return array
				 */
				static function getUriParts( ) {

					return self::$uri_parts;
				}

				/**
				 * Establece las partes de la URI
				 * @param array  $uri_parts
				 */
				static function setUriParts( $uri_parts ) {

					self::$uri_parts = $uri_parts;
				}
			}